from rest_framework import serializers
from django_redis import get_redis_connection
# serializers.ModelSerializer
# serializers.Serializer
# 我们没有关联 模型,所以选择 Serializer

class RegisterSmscodeSerializer(serializers.Serializer):

    text = serializers.CharField(label='图片验证码', max_length=4, min_length=4, required=True)
    image_code_id = serializers.UUIDField(label='uuid', required=True)

    """
        对数据的验证有 4中方式:
            1.字段类型
            2.字段选项
            3.单字段校验
            4.多字段校验
        """

    # def validate(self, data):
    def validate(self, attrs):

        # data --> attrs
        image_code_id = attrs.get('image_code_id')
        # 1. 获取用户提交的图片验证码
        text = attrs.get('text')

        # 2.获取redis 的图片验证码
        # 2.1 连接redis
        redis_conn = get_redis_connection('code')
        # 2.2 获取
        redis_text = redis_conn.get('img_%s' % image_code_id)
        # 2.3 注意有效期
        if redis_text is None:
            raise serializers.ValidationError('图片验证码已过期')
        # 3.对比
        # 注意点: redis的数据是 bytes类型
        #       大小写
        if redis_text.decode().lower() != text.lower():
            raise serializers.ValidationError('图片验证码不一致')

        # 必须要将验证的值 返回
        return attrs